package com.charging.business.media;

import com.charging.business.utils.ToolsUtil;

/**
 * 用户卡复合消费专用文件(DF01/0019)编码信息
 * 43bytes
 */
public class Card0019EdModel {
    public static final int MSG_LEN = 43;

    /**
     * 应用标示(	01-01,1,b)
     * 0xAA-ETC 正常插卡；
     * 0xBB-ETC 用户入口异常,入口信息写入OBU;
     * 0xCC-ETC用户入口异常，第一个读取到 OBU 的门架作为入口门架写入
     */
    public byte[] applySign = new byte[1];

    /**
     * 记录长度(	02-02,1,n)
     * 固定为0x29
     */
    public byte[] recordLength = new byte[1];

    /**
     * 应用锁定(03-03,1,n)
     * 0x00-未锁定；0x01-已锁定；其他值-保留
     */
    public byte[] applyLockSign = new byte[1];

    /**
     * 入口网络(04-05,2,cn)
     * 样例:0x4101
     */
    public byte[] netWork = new byte[2];

    /**
     * 入口站号(06-07,2,n)
     */
    public byte[] enStationId = new byte[2];

    /**
     * 入口道号(08-08,1,n)
     */
    public byte[] enLaneId = new byte[1];

    /**
     * 入口时间(09-12,4,n)
     * 北京时间 2015-4-2 15:36:20 UNIX 时间为 55 1C F1	74
     */
    public byte[] enTime = new byte[4];

    /**
     * 入口车型(13-13,1,n)
     */
    public byte[] vehicleType = new byte[1];

    /**
     * 流通状态(14-14,1,n)
     * 0x00－保留， 0x 01－封闭 E/M混合入口， 0x02－封闭 E/M 混合出口， 0x03－封闭 ETC 入口，0x04－封闭 ETC 出口， 0x05－E/M 混合开放式， 0x06－ ETC 开放式， 0x07～ 0F 自定义， 0x10－自助
     */
    public byte[] cardState = new byte[1];

    /**
     * 门架编号(15-17,3,bn)
     */
    public byte[] preGantryNo = new byte[3];

    /**
     * 门架时间(18-21,4,n)
     * 北京时间 2015-4-2 15:36:20 UNIX 时间为 55 1C F1 74
     */
    public byte[] preGantryTime = new byte[4];

    /**
     * 车牌号码(22-33,12,an)
     */
    public byte[] plateNumber = new byte[12];

    /**
     * 车牌颜色(34-34,1,n)
     * 0x00 –蓝色； 0x01–黄色； 0x02 –黑色； 0x03 –白色； 0x04－渐变绿色； 0x05－黄绿双拼色； 0x06－蓝白渐变；0x07～ 0xFF 保留
     */
    public byte[] plateColor = new byte[1];

    /**
     * 货车轴数(35-35,1,n)
     */
    public byte[] axleCount = new byte[1];

    /**
     * 货车总重(36-38,3,n)单位kg
     */
    public byte[] totalWeight = new byte[3];

    /**
     * 车辆状态标识(39-39,1,n)
     * 0x00－本次通行用于大件运输
     * 0x01－非优惠车辆
     * 0x02－绿通
     * 0x03－联合收割机
     * 0x04－集装箱车辆
     * 0xFF－默认
     */
    public byte[] vehicleSign = new byte[1];

    /**
     * 一类交易累计金额(40-43,4,n)
     * 单位：分
     */
    public byte[] amounts = new byte[4];

    private static Card0019EdModel parseSelf(byte[] buff) {
        int index = 0;
        Card0019EdModel ret = new Card0019EdModel();
        index += ToolsUtil.arrcopy(buff, index, ret.applySign);
        index += ToolsUtil.arrcopy(buff, index, ret.recordLength);
        index += ToolsUtil.arrcopy(buff, index, ret.applyLockSign);
        index += ToolsUtil.arrcopy(buff, index, ret.netWork);
        index += ToolsUtil.arrcopy(buff, index, ret.enStationId);
        index += ToolsUtil.arrcopy(buff, index, ret.enLaneId);
        index += ToolsUtil.arrcopy(buff, index, ret.enTime);
        index += ToolsUtil.arrcopy(buff, index, ret.vehicleType);
        index += ToolsUtil.arrcopy(buff, index, ret.cardState);
        index += ToolsUtil.arrcopy(buff, index, ret.preGantryNo);
        index += ToolsUtil.arrcopy(buff, index, ret.preGantryTime);
        index += ToolsUtil.arrcopy(buff, index, ret.plateNumber);
        index += ToolsUtil.arrcopy(buff, index, ret.plateColor);
        index += ToolsUtil.arrcopy(buff, index, ret.axleCount);
        index += ToolsUtil.arrcopy(buff, index, ret.totalWeight);
        index += ToolsUtil.arrcopy(buff, index, ret.vehicleSign);
        index += ToolsUtil.arrcopy(buff, index, ret.amounts);

        // GBK车牌号码矫正
        chkVPlate(ret.plateNumber);

        return ret;
    }

    /**
     * 预解析
     *
     * @param strHex
     * @return
     */
    public static Card0019EdModel parse(String strHex) {
        if (strHex == null || strHex.isEmpty()) {
            return null;
        }
//        if (strHex.length() < UCARD0019ED.MSG_LEN * 2) {
//            return null;
//        }
        if (!ToolsUtil.chkHexChar(strHex)) {
            return null;
        }
        byte[] buff = ToolsUtil.hex2bin(strHex);
        return parseSelf(buff);
    }

    /**
     * 信息解码
     *
     * @return
     */
    public Card0019Model decoded() {
        Card0019Model dd = new Card0019Model();
        dd.applySign = ToolsUtil.bin2int(applySign);
        dd.recordLength = ToolsUtil.bin2int(recordLength);
        dd.applyLockSign = ToolsUtil.bin2int(applyLockSign);
        dd.netWork = ToolsUtil.bin2hex(netWork);
        dd.enStationId = ToolsUtil.bin2hex(enStationId);
        dd.enLaneId = ToolsUtil.bin2int(enLaneId);
        dd.enTime = ToolsUtil.bin2lng(enTime);
        dd.vehicleType = ToolsUtil.bin2int(vehicleType);
        dd.cardState = ToolsUtil.bin2int(cardState);
        dd.preGantryNo = ToolsUtil.bin2hex(preGantryNo);
        dd.preGantryTime = ToolsUtil.bin2lng(preGantryTime);
        dd.plateNumber = ToolsUtil.bin2str(plateNumber);
        dd.plateColor = ToolsUtil.bin2int(plateColor);
        dd.axleCount = ToolsUtil.bin2int(axleCount);
        dd.totalWeight = ToolsUtil.bin2int(totalWeight);
        dd.vehicleSign = ToolsUtil.bin2int(vehicleSign);
        dd.amounts = ToolsUtil.bin2lng(amounts);

        return dd;
    }

    private static void chkVPlate(byte[] zb) {
        for (int aa = zb.length - 1; aa >= 0; aa--) {
            if (zb[aa] == (byte) 0xff) {
                zb[aa] = 0;
            } else {
                break;
            }
        }
    }
}
